package com.wavehi.homework.third;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * @Author WaveHi
 * @Date 28/8/2021 下午 7:24
 * @Version 1.0
 * @Contact HJBWaveHi@163.com
 * @Description Third homework : Demonstrate the use of Stream.
 */
public class StreamDemo1 {

    public static void main(String[] args) {
        //获取流
        //使用Stream类来获取流
        Stream<Integer> stream = Stream.of(1, 2, 5);

        //使用Arrays工具类来获取流
        int[] nums = {2, 43, 54, 643, 23, 53};
        IntStream stream1 = Arrays.stream(nums);

        //使用Collection接口的方法来获取流
        List<Integer> integers = Arrays.asList(1, 43, 54, 6, 321, 545, 1);
        Stream<Integer> stream2 = integers.stream();

        //演示流的常见操作
        stream.distinct().map(i -> i + 2).forEach(System.out :: println);
        stream1.limit(5).skip(1).forEach(System.out :: println);
        stream2.collect(Collectors.mapping(i -> i * 2,Collectors.toList()));

    }

}
/*
小结：1.Stream流给我们提供了一种高效且易于操作对数据的处理方式。使得对集合数据的操作向使用sql语句查询数据库一样简单，
       且操作过程可并行执行。
     2.创建方式：Arrays.stream(T[] array)
               Stream.of(T... args);
               Stream.iterate(final T seed, final UnaryOperator<T> f)
               Stream.generate(Supplier<T> supplier)
               stream();
               parallelStream();
     3.中间操作 ：又分为筛选、切片、映射和排序
       终止操作 ：又分为匹配、查找、归约和收集
       筛选和切片：filter(Predicate p) 过滤掉不符合条件的数据
                 distinct() 去除重复的数据
                 limit(long maxSize) 截取部分数据
                 skip(long n) 忽略前面的一部分数据
            映射：map(Function f) 按照指定的映射关系将流中的每个数据转换为指定的值
            排序：sorted() 按照自然排序对流中的数据由大到小进行排序
                 sorted(Comparator com) 按照给定比较器的排序方式对流中的数据进行排序
       匹配和查找：allMatch(Predicate p) 判断流中的数据是否都满足条件
                 anyMatch(Predicate p) 判断流中是否由数据满足条件
                 noneMatch(Predicate p) 判断流中的数据是否都不满足条件
                 findFirst() 查找流中的第一个数据
                 findAny() 获取流中任意一个数据
                 max(Comparator com) 根据给定的比较器获取流中最大的元素
                 min(Comparator com) 根据给定的比较器我获取流中最小的数据
                 count() 统计流中的数据个数
                 forEach(Consumer<T> con) 内部迭代
            归约：reduce(T seed,BinaryOperator f) 将流中的数据两两结合起来
            收集：collect(Collector col) 根据给定的收集器对流中的数据进行存储和组织。
     4.并行。同一时间点内执行多条路径
       并发：同一时间段执行多条路径
     5.parallel() 可以将一个普通流转换为并行流
 */

